package com.czk.algorithm.greedy;

import java.util.*;

/**
 * 贪心算法
 * 特点，每次都选择最优的
 * @Author:ChenZhangKun
 * @Date: 2020/8/1 21:33
 */
public class GreedyDemo {
    public static void main(String[] args) {
        // 创建HashMap存储电台
        Map<String, HashSet<String>> map=new HashMap<>();
        // 初始化电台
        HashSet<String> hashSet1=new HashSet<>();
        hashSet1.add("北京");
        hashSet1.add("上海");
        hashSet1.add("天津");
        HashSet<String> hashSet2=new HashSet<>();
        hashSet2.add("广州");
        hashSet2.add("北京");
        hashSet2.add("深圳");
        HashSet<String> hashSet3=new HashSet<>();
        hashSet3.add("成都");
        hashSet3.add("上海");
        hashSet3.add("杭州");
        HashSet<String> hashSet4=new HashSet<>();
        hashSet4.add("天津");
        hashSet4.add("上海");
        HashSet<String> hashSet5=new HashSet<>();
        hashSet5.add("杭州");
        hashSet5.add("大连");
        // 加入map
        map.put("k1",hashSet1);
        map.put("k2",hashSet2);
        map.put("k3",hashSet3);
        map.put("k4",hashSet4);
        map.put("k5",hashSet5);
        // 创建all areas,存放所有的地区
        HashSet<String> allAreas=new HashSet<>();
        for (String s : map.keySet()) {
            allAreas.addAll(map.get(s));
        }
        // 创建存放电台的集合
        List<String> selects=new ArrayList<>();
        // 定义临时集合保存在遍历的过程中的交际
        Set<String> tempSet=new HashSet<>();
        // 定义maxKey，保存再一次遍历过程中能够覆盖最多为覆盖的地区对应的电台的key
        String maxKey;
        // 如果max不等于空，则将其加入selects里面
        while (allAreas.size()!=0){
            // 每次将maxKey置空
            maxKey=null;
            // 取出key
            for (String key : map.keySet()) {
                // 清空tempSet
                tempSet.clear();
                HashSet<String> hashSet = map.get(key);
                // 加入临时集合
                tempSet.addAll(hashSet);
                tempSet.retainAll(allAreas);
                // 求交集
                // 交集会赋给tempSet
                if (tempSet.size()>0&&(maxKey==null||map.get(maxKey).size()<tempSet.size())){
                    // 如果当前集合长度比maxKey对应的集合长度还多
                    maxKey=key;
                }
            }
            if (maxKey!=null){
                // 将其加入集合
                selects.add(maxKey);
                // 将maxKey包含的地区从从allAreas去掉
                allAreas.removeAll(map.get(maxKey));
            }
        }
        System.out.println("选择结果 "+selects);
    }
}
